package de.hsos.ooad.nutzerverwaltung.interaktiv;

import java.util.ArrayList;
import java.util.List;

public class Zugriffsverwaltung {
	
	/**
	 * aktueller Nutzer, der gerade im System angemeldet ist, 
	 * am Anfang ist niemand angemeldet.
	 */
	private Nutzer aktuellerNutzer;
	/**
	 * Liste aller im System vorhandenen Nutzer.
	 */
	private List<Nutzer> nutzer;
	
	public Zugriffsverwaltung() {
		aktuellerNutzer = null;
		nutzer = new ArrayList<Nutzer>();
		nutzer.add(new Projektadministrator());		
	}
	
	/**
	 * Prüft, ob ein Nutzer zum eingegebenen Paar login, passwort gehört, ist ein solcher
	 * vorhanden, wird er zum aktuellen Nutzer, das Ergebnis informiert, ob die Anmeldung
	 * erfolgreich war.
	 * @param login		Loginname des zu authentifizierenden Nutzers
	 * @param passwort	Passwort des zu authentifizierenden Nutzers
	 * @return			'true' falls Anmeldung erfolgreich, 'false' wenn nicht
	 */
	public boolean authentifizieren(String login, String passwort) {
		for (Nutzer n:this.nutzer) {
			if (n.getLogin().equals(login)
			&&  n.getPasswort().equals(passwort)) {
				aktuellerNutzer = n;
				return true;
			}
		}
		return false;
	}
	
	/**
	 * Zeigt zu jedem eingetragenen Nutzer das Login, das Passwort und die Rechte, ob
	 * Nutzer angelegt werden, ob Tabellen angelegt und ob Daten bearbeitet werden dürfen.
	 */
	public void nutzerAnzeigen() {
		System.out.printf("%-40s %-19s\n"," ","Schreibrechte");
		System.out.printf("%-20s %-15s %-5s %-8s %-6s","Login","Passwort","Daten","Tabellen","Nutzer");
		System.out.println("\n----------------------------------------------------------");
		
		for (Nutzer n:this.nutzer) {
			String editData = " ";
			String editTables = " ";
			String editUser = " ";
			
			if (n.darfDatenBearbeiten())
				editData = "  x";
			if (n.darfNutzerAnlegen())
				editUser = "  x";
			if (n.darfTabellenBearbeiten())
				editTables = "   x";
			
			System.out.printf("%-20s %-15s %-5s %-8s %-6s\n",
					n.getLogin(),
					n.getPasswort(),
					editData,
					editTables,
					editUser
			);
		}
		System.out.println();
		System.out.println();
	}
	
	/**
	 * Insofern der aktuelle Nutzer neue Nutzer anlegen darf und ein Nutzer unter dem
	 * alten Login existiert, wird das Login auf das neue Login abgeändert, das Ergebnis gibt
	 * an, ob die Änderung erfolgreich war.
	 * @param altesLogin	alter Loginname
	 * @param neuesLogin	neuer Loginname
	 * @return	'true' falls Änderung erfolgreich, 'false' wenn nicht
	 */
	public boolean loginAendern(String altesLogin, String neuesLogin) {
		if (aktuellerNutzer.darfNutzerAnlegen()) {
			for (Nutzer n:nutzer) {
				if (n.getLogin().equals(altesLogin)) {
					if (this.loginAendern(neuesLogin, neuesLogin))
						return false;	//Nutzername schon vorhanden
					n.setLogin(neuesLogin);
					return true;
				}
			}
		}
		return false;
	}
	
	/**
	 * Insofern ein aktueller Nutzer existiert und das richtige alte Passwort übergeben
	 * wird, wird das Passwort auf neuesPasswort geändert, das Ergebnis informiert, ob die
	 * Änderung erfolgreich war.
	 * @param altesPasswort	altes Passwort
	 * @param neuesPasswort	neues Passwort
	 * @return	'true' falls Änderung erfolgreich, 'false' wenn nicht
	 */
	public boolean passwortAendern(String altesPasswort, String neuesPasswort) {
		if (aktuellerNutzer != null) {
			if (aktuellerNutzer.getPasswort().equals(altesPasswort)) {
				aktuellerNutzer.setPasswort(neuesPasswort);
				return true;
			}
		}
		return false;
	}
	
	/**
	 * Insofern der aktuelle Nutzer neue Nutzer anlegen darf, wird ein Entwickler mit
	 * angegebenem login und passwort hinzugefügt, das Ergebnis gibt an, ob das Hinzufügen
	 * erfolgreich war.
	 * @param login		Loginname des neues Entwicklers
	 * @param passwort	Passwort des neues Entwicklers
	 * @return	'true' falls Hinzufügen erfolgreich, 'false' wenn nicht
	 */
	public boolean entwicklerHinzufuegen(String login, String passwort) {
		if (aktuellerNutzer != null
		&&  aktuellerNutzer.darfNutzerAnlegen()) {
			for (Nutzer n:nutzer) {
				if (n.getLogin().equals(login))
					return false;	//Nutzername schon vorhanden
			}
			
			nutzer.add(new Entwickler(login, passwort));
			return true;
		}
		return false;
	}
	
	/**
	 * Insofern der aktuelle Nutzer neue Nutzer anlegen darf, wird ein
	 * Projektadministrator mit angegebenem login und passwort hinzugefügt, das Ergebnis gibt
	 * an, ob das Hinzufügen erfolgreich war.
	 * @param login		Loginname des neues Projektadministrators
	 * @param passwort	Passwort des neues Projektadministrators
	 * @return	'true' falls Hinzufügen erfolgreich, 'false' wenn nicht
	 */
	public boolean projektadministratorHinzufuegen(String login, String passwort) {
		if (aktuellerNutzer != null
		&&  aktuellerNutzer.darfNutzerAnlegen()) {
			for (Nutzer n:nutzer) {
				if (n.getLogin().equals(login))
					return false;	//Nutzername schon vorhanden
			}
			
			nutzer.add(new Projektadministrator(login, passwort));
			return true;
		}
		return false;
	}
	
	/**
	 * Insofern der aktuelle Nutzer neue Nutzer anlegen darf, wird ein
	 * Systemadministrator mit angegebenem login und passwort hinzugefügt, das Ergebnis
	 * gibt an, ob das Hinzufügen erfolgreich war.
	 * @param login		Loginname des neues Systemadministrators
	 * @param passwort	Passwort des neues Systemadministrators
	 * @return	'true' falls Hinzufügen erfolgreich, 'false' wenn nicht
	 */
	public boolean systemadministratorHinzufuegen(String login, String passwort) {
		if (aktuellerNutzer != null
		&&  aktuellerNutzer.darfNutzerAnlegen()) {
			for (Nutzer n:nutzer) {
				if (n.getLogin().equals(login))
					return false;	//Nutzername schon vorhanden
			}
			
			nutzer.add(new Systemadministrator(login, passwort));
			return true;
		}
		return false;
	}
}
